#include "ft32f0xx.h"
#include "def.h"
#include "info.h"
#include "stdio.h"
#include "usart.h"
#include "delay.h"
#include "crc.h"
#include "bootcmd.h"
#include "jump2App.h"

/*
BOATLOADER 基于 FT32F030的简易Bootloader
支持若干个指令
命令hex
主机命令格式: 0xFE 0xA5 [CMD] [DATA]
从机回复格式: 0xFE 0x5A [RET] [DATA]

[CMD]&[DATA格式]
0x00: 查询设备信息
从机返回 0xFE 0x5A 0x00 [字符串信息]
0x01: 建立连接
从机返回 0xFE 0x5A 0x01:成功

0x02: 擦除flash
从机返回 0xFE 0x5A 0x02:成功

0x03: 开始写入flash
从机返回 0xFE 0x5A 0x03:成功，此时等待数据包发送
重置flash写入字节计数器，从APP START address开始写起
此时数据可以连续不断的发送至串口，需要注意单个数据包大小不可超过128字节

0x04: 结束写入
0x04 0xAA 0x58 0xAA 0x59 必须满足全部字串匹配后，设备才会退出写入
从机返回 0xFE 0x5A 0x04:成功

0x05:写入CRC
[0x05] [CRC]
从机返回 0xFE 0x5A 0x05:成功写入，0x02:失败

0x06: 读取CRC成功与否
从机返回 0xFE 0x5A 0x06 [0:1]:内部固件CRC计算值 0失败，1成功


0xF1:单片机重启
设备重启，从机无返回
从机返回 0xFE 0x5A 0xF1 设备进入重启
0xF2:强制跳转APP
从机返回 0xFE 0x5A 0xF2 成功

*/
/*代码参考了dengbaoan
https://github.com/dengbaoan/stm32-boot
*/
/*
软件分为俩部分
1.bootloader模板
2.app模板
3.上位机应用程序
*/

unsigned char buf[4] = {1, 2, 3, 4};
GBool bootloop = GFalse;
//每当DMA接收到数据时发生中断
void OnUart1DataReceived(unsigned char *buffer, unsigned int datalen)
{
    bootloop = GTrue;
    cmdProc(buffer, datalen);
}
/*主函数执行一个基于串口的简单交互工具用来进入调试模式*/
int main()
{
    unsigned int cnt = 0;
    OnDataReceived = NULL;
    usart_init();
    OnDataReceived = OnUart1DataReceived;
    delay_ms(100);
    bootloop = GFalse;
    while (1)
    {
        if (bootloop == GFalse)
        {
            delay_ms(1);
            cnt++;
            if (cnt >= 3000)
            {
                cnt = 0;
                if (isCrcOK())
                {
                    jump2APP();
                }
            }
        }
        cmd_serivce();
    }
}
